<script>
    // 数据播种的时机
    /*
                        abp的数据播种是在什么时候运行？   是在web项目启动时还是在运行DbMigrator 项目的时候？

                        ABP的数据播种 (IDataSeedConributor实现)  默认在 "两个时机运行"，核心取决于你是否使用 ABP的 DbMigrator 项目 (数据库迁移工具)

                        且优先级有明确区分------避免重复播种，同时保障数据说实话的可靠性：
    */

    /*

            一、核心结论

                                    <1>、优先时机：

                                                运行DbMigrator 项目时  (主动执行数据库迁移+数据播种)

                                    <2>、兜底时机：

                                                Web/API 项目首次启动时  (若数据库已存在单未播种数据，会补充执行)；

                                    <3>、本质： 

                                                DbMigrator 是ABP  推荐的 "数据播种主入口" ，项目启动时的播种是 "兜底方案"，避免因未运行DbMigrator 导致的数据缺失。

    */

    /*
            二、分场景详细说明：

                                    <1>、运行 DbMigrator 项目时 (推荐！ 生产环境必用)

                                                DbMigrator 是ABP模板主动生成的独立控制台项目，核心职责是： "执行数据库迁移(创建表/更新结构) + 执行数据播种"，

                                                是数据初始化的 "官方推荐路径"

                                                (1)、运行时机：

                                                        手动右键启动DbMigrator 项目，或通过命令执行 dotnet run 时；

                                                (2)、播种逻辑：

                                                        DbMigrator 会在迁移完成后，主动调用所有实现 IDataSeedConributor 接口的实现类的 SeedAsync 方法，

                                                        且会传递 DataSeedContext 参数标记 "由 DbMigrator 触发"；

                                                (3)、关键特定

                                                        ①、支持多租户播种 (宿主租户+ 指定租户)

                                                        ②、会记录播种状态  (避免重复执行，即使多次运行DbMigrator ，已播种的数据不会重复插入)

                                                        ③、生产环境必须通过DbMigrator 初始化数据库和数据 (避免项目自动是因权限不足、网络问题等导致播种失败)

                                    <2>、Web/API 项目启动时 (兜底方案)

                                                若你未运行 DbMigrator 项目，直接启动 Web/API 项目，ABP会在项目启动过程中触发数据播种，确保数据库有基础数据  (如角色、权限、初始配置)

                                                (1)、运行时机：

                                                        web项目启动时 （OnApplicationInitialization 阶段），且满足两个条件：

                                                             ①、数据库存在 (通过EF Core 自动迁移或手动创建)

                                                             ②、数据尚未播种  (或播种状态未记录)

                                                (2)、播种逻辑：

                                                        ABP会自动扫描所有 IDataSeedConributor 并执行，行为与 DbMigrator 中一致，但有局限

                                                (3)、局限性：

                                                        ①、生产环境不推荐一来此方式：  Web项目启动时可能因为数据库权限不足、连接超时等问题导致播种失败；

                                                        ②、多租户场景支持有限：

                                                                    默认金播种宿主租户数据，租户数据需手动处理。

                                                        ③、重复播种风险：

                                                                    若项目多次重启，可能触发重复播种  (需在SeedAsync 中手动判断数据是否已存在，如之前角色播种时的FirstOrDefaultAsync 检查)

    */

    /*
            三、关键补充：  如何控制播种时机 、避免重复？

                                    <1>、禁用项目启动时的播种  (推荐生产环境)

                                                为了轻质通过 DbMigrator 播种，避免启动时冗余执行，可在Web项目的模块类中禁用启动时播种:

                                                        [DependsOn( 依赖模块 )]
                                                        public class YourProjectNameWebModule : AbpModule
                                                        {
                                                            public override void ConfigureServices(ServiceConfigurationContext context)
                                                            {
                                                                // 禁用 Web 启动时的数据播种（仅保留 DbMigrator 中的播种）
                                                                Configure<AbpDataSeederOptions>(options =>
                                                                {
                                                                    options.SkipOnStartup = true; // 关键配置：启动时不执行播种
                                                                });
                                                            }
                                                        }

                                    <2>、播种时的重复判断  (必加逻辑)

                                                无论哪种时机，SeedAsync 中必须添加  "数据是否已存在"的判断。  (之前角色播种时的 FirstOrDefaultAsync)

                                                原因：

                                                    ①、ABP仅记录 "是否执行过播种"，不记录 "具体数据是否已插入"；

                                                    ②、若手动删除模条播种数据，重新执行播种需能补插；

                                                    ③、避免多次运行DbMigrator 导致数据重复  (如重复创建同一个角色)。

                                    <3>、多租户场景的播种

                                                若你的SaaS团餐系统支持多租户，播种时需区分 "宿主租户" 和 "租户"：

                                                    public async Task SeedAsync(DataSeedContext context)
                                                    {
                                                        // 宿主租户播种（全局配置、系统角色等）
                                                        await SeedHostDataAsync(context);
                                                        
                                                        // 特定租户播种（如默认租户的初始数据）
                                                        if (context.TenantId == null)
                                                        {
                                                            await SeedTenantDataAsync(Guid.Parse("租户ID"));
                                                        }
                                                    }
*/

/*

        四、总结  (结合你的SaaS)团餐系统

                                    <1>、开发/测试环境：  

                                                可直接启动Web项目，一来启动时的兜底播种凯斯初始化数据;

                                    <2>、生产环境：

                                                必须选运行 DbMigrator 项目 (执行迁移+播种)，再启动Web项目，同时禁用Web启动时的播种 (SkipOnStartup =true),

                                                避免权限问题和重复播种。

                                    <3>、核心原则：

                                                DcMigrator 是"数据播种主入口" ，项目启动播种是 "备用方案"，实际爱开发中需以 DbMigrator 为准，  确保数据初始化的一致性。


                                ★、简单记：

                                            生产用 DbMigrator ,开发可启动兜底，播种必加重复判断。
    */
</script>